package com.IO流.InputStream字节输入流;

import org.junit.jupiter.api.Test;
import java.io.FileInputStream;
import java.io.IOException;

@SuppressWarnings("all")
public class FileInputStream_Exercise01 {
    /**
     * 演示FileInputStream的使用（字节输入流  读取文件到程序中；
     */
    public static void main(String[] args) {

    }
    String filepath = "D:\\JAVA_test\\hello.txt";  ///文件路径

    @Test
    public void method01(){
        /***     效率低
         * fileInputStream.read()  一个一个字节的读取，若读取到像汉字三个字节的就会乱码；若返回的是-1则表示结束；；
         */
        FileInputStream fileInputStream = null; ///文件引用
        int readData = 0;   ///获取 读取的字节
        try {
            fileInputStream = new FileInputStream(filepath);///创建文件
            while((readData = fileInputStream.read()) != -1){  /// 若创建没有抛出异常，就一个字节的循环读取，并转成字符输出；
                System.out.print((char)readData); ///转成字符输出；
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                fileInputStream.close();  ///为了避免资源的浪费，读取完后要关闭字节流，需要try-catch
                System.out.println("文件成功关闭");
            } catch (IOException e) {
                System.out.println("文件关闭失败");
                throw new RuntimeException(e);
            }
        }
    }

    @Test
    public void method02(){
        /***   效率高
         * fileInputStream.read(byte[] b)  按照byte数组长度来读取字节，若返回的是-1则表示结束；
         *例如 byte[] b = new byte[8]  这个会按照8个字节来读取，如果不足8个，例如只有6个字节，只读取6个字节到数组中
         * hello,wo  第一次读取8个
         * lrd!  第二次不足8个，就读取剩余的4个
         */
        FileInputStream fileInputStream = null; ///文件引用
        byte[] byt = new byte[8];   ///读取到该数组
        int readLength = 0;   ///获取 读取的字节
        try {
            fileInputStream = new FileInputStream(filepath);///创建文件
            while((readLength = fileInputStream.read(byt)) != -1){  /// 若创建没有抛出异常，就b.length个字节的循环读取，并转成字符输出；
                System.out.print(new String(byt,0,readLength));
                ///数组转成字符串输出；String(数组，开始索引，截止索引) ，因为byt数组中还存放着上次读取的值，所以这次读取readLength个，就往String放入readLength个
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            try {
                fileInputStream.close();  ///为了避免资源的浪费，读取完后要关闭字节流，需要try-catch
                System.out.println("文件成功关闭");
            } catch (IOException e) {
                System.out.println("文件关闭失败");
                throw new RuntimeException(e);
            }
        }
    }


}
